package com.cskaoyan.javase.object.tostring3;

/**
 * @description: toString()方法
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Arrays;

/**
 * 方法的声明:
 * public String toString()
 * 没有特别的 它的返回值是一个String字符串
 * toString()这个方法 和它的字面意思一样,把一个对象(数组)转换成字符串输出
 * - 返回该对象的字符串（String）表示
 * - 通常，toString 方法会返回一个“以文本方式表示”此对象的字符串
 * - 结果应是一个简明但易于读懂的信息表达式
 * - 建议所有子类都重写此方法
 *
 * Object类当中toString方法
 * return getClass().getName() + "@" + Integer.toHexString(hashCode());
 * 获取全限定类名 + @ + 十六进制整数值(表示地址的)
 *
 * Object类当中的toString方法显然不能满足我们的需求,我们更希望通过toString方法看到这个对象的成员变量的取值
 * 这样对于对象而言才是一个简单明了的描述
 * 咋办?
 * 父类方法不能满足需求,需要子类自己重写
 * 常见的toString标准格式:
 * 对象所属类型{成员变量1 = '值1' ,成员变量2 = '值2'....}
 *
 * 注意事项:
 * - 直接打印数组名或者对象名，默认调用toString()方法，然后打印该方法返回的字符串
 * - 用一个字符串和一个对象直接拼接，默认拼接该类的toString()方法字符串
 * 只要是引用名直接参与了运算 打印 一律是toString()方法参与
 * - 如果你在toString当中写奇怪的代码 比如说修改成员变量的取值
 * 那么在debug模式中会有一些奇怪的bug
 * IDEA运行debug模式时 当走过对象时,会调用该对象的toString方法 打印到代码后面
 * 如果你在toString方法中乱写 会导致奇怪的bug
 * 所以这里重要提示:
 * toString人家就想做个好人 老老实实打印对象信息
 * 你不要给人家不当人 里面乱写代码
 * 不要在toString()方法里对对象进行操作，避免造成奇怪的bug
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        //我们已经使用过toString方法了
       /* int[] arr = {1,2,3};
        String s = Arrays.toString(arr);
        System.out.println(s);*/

        Person p = new Person(10, 1000,new World(20),"王二");
        //打印该对象的toString()方法的返回值
        System.out.println(p.toString());
        //直接打印对象的引用名
        System.out.println(p);

        System.out.println(p+"hello");


    }
}

class Person {
    int age;
    double salary; //基本数据类型
    //类中有引用数据类型成员变量
    World w;
    String name;

    public Person(int age, double salary, World w, String name) {
        this.age = age;
        this.salary = salary;
        this.w = w;
        this.name = name;
    }

    public Person() {
    }

    public Person(int age, double salary) {
        this.age = age;
        this.salary = salary;
    }

    public Person(int age, double salary, World w) {
        this.age = age;
        this.salary = salary;
        this.w = w;
    }
    //重写toString方法
    //@Override
    //public String toString() {
    //    return "Person {age=" + age + ", salary=" + salary+"}";
    //}
    //toString()方法的书写是比较机械,所以IDEA给了我们快捷键 alt+insert

    @Override
    public String toString() {
        //toString方法当中写奇怪的代码
        //System.out.println("11111111");
        //age = 5000;
        return "Person{" +
                "age=" + age +
                ", salary=" + salary +
                ",w="+w+
                ",name="+name+
                '}';
    }
}
class World{
    int a;

    public World() {
    }

    public World(int a) {
        this.a = a;
    }

    @Override
    public String toString() {
        return "World{" +
                "a=" + a +
                '}';
    }
}
